﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace Securfid
{
    class SqlCommands
    {
        //Declaration des variables communes
        public static string connectionString = ConfigurationManager.ConnectionStrings["TGE_Connection"].ConnectionString;

        public static List<Lectures> TagSQLtoMemoire(string table)
        {
            //La requête SQL
            string query = String.Format("SELECT * FROM {0}", table);

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                //Création de la commande envoyé à SQL
                SqlCommand command = new SqlCommand(query, connection);

                //Exécution de la commande et réception de celle-ci dans `reader`
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();

                //Inscrit les lectures dans une liste `list` de classe `Lectures` 
                List<Lectures> list = new List<Lectures>();
                while (reader.Read())
                {
                    //Convertit la lecture de la base de données pour la remettre en classe
                    Lectures resultat = new Lectures();
                    resultat.Initialise(Convert.ToInt32(reader[0]), Convert.ToString(reader[1]), Convert.ToString(reader[2]), Convert.ToString(reader[3]), Convert.ToString(reader[4]), Convert.ToBoolean(reader[5]), Convert.ToInt32(reader[6]), Convert.ToInt32(reader[7]));
                    list.Add(resultat);
                }
                reader.Close();

                if (list.Count() == 0) {
                    return null; }
                else {
                    return list; }
            }
        }

        public static void ConfigtoMemoire(string table, out Configs config, out List<string> email)
        {
            //La requête SQL
            string query = String.Format("SELECT * FROM {0}", table);

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                //Création de la commande envoyé à SQL
                SqlCommand command = new SqlCommand(query, connection);

                //Exécution de la commande et réception de celle-ci dans `reader`
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();

                //Inscrit les lectures dans une liste `list` de classe `Lectures`
                email = new List<string>();
                config = new Configs();

                while (reader.Read())
                {
                    //Convertit la lecture de la base de données pour la remettre en classe
                    if (config.Gettemps_alarme() == 0)
                    {
                        config.Initialise(Convert.ToInt32(reader[0]), Convert.ToInt32(reader[1]), Convert.ToInt32(reader[2]), Convert.ToString(reader[3]), Convert.ToString(reader[4]), Convert.ToBoolean(reader[5]));
                    }
                    email.Add(Convert.ToString(reader[4]));
                }
                reader.Close();
            }
        }

        public static void ChangeDerniereVu(List<Lectures> TagMEM, string heure)
        {
            string query = null;
            foreach (Lectures Tag in TagMEM)
            {
                if (query != null)
                {
                    query += "; ";
                }
                query += String.Format("UPDATE dbo.rfid SET time = '{0}' WHERE id_rfid = '{1}'", heure, Tag.Getid_rfid());
            }
            if (query != null)
            {
                ExecuteNonQuery(query);
            }
        }

        public static void ExecuteNonQuery(string query)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                //Création de la commande envoyé à SQL
                SqlCommand command = new SqlCommand(query, connection);
                try
                {
                    //Exécution de la commande et réception de celle-ci dans `reader`
                    command.Connection.Open();
                    command.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    DisplaySqlErrors(ex);
                }
                command.Connection.Close();
            }
        }
    
        private static void DisplaySqlErrors(SqlException exception)
        {
            for (int i = 0; i < exception.Errors.Count; i++)
            {
                Console.WriteLine("Index #" + i + "\n" +
                    "Error: " + exception.Errors[i].ToString() + "\n");
            }
        }

        public static List<Lectures> MAJAlarme(List<Lectures> alarme, List<Lectures> TagSQL, string heure, List<string> email, string local, Configs config, List<Appareils> appareils)
        {
            
            string query = null;
            string alarme_email = String.Format("{0}\r\n \r\n Appareils en alarme :\r\n", heure);
            foreach (Lectures Tag in alarme)
            {
                Lectures temp = TagSQL.Find(delegate(Lectures t) { return t.Getid_rfid() == Tag.Getid_rfid(); });
                if (temp.GetAlarme() == false)
                {
                    Tag.alarme = true;          //Modifie l'alarme en mémoire
                    if (query != null)
                    {
                        query += "; ";
                    }
                    query += String.Format("UPDATE dbo.rfid SET alarme = 'true', heure_alarme = '{0}' WHERE id_rfid = '{1}'", heure, Tag.Getid_rfid());

                    alarme_email += String.Format("{0} Poste : {1} - {2}\r\n", local, Tag.GetPoste(), Appareils.TrouveDescAppareil(Tag.GetIdAppareil(), appareils));       
                }
            }
            if (query != null)
            {
                foreach (string EM in email)
                {
                    ExecuteNonQuery(query);
                    Configs.email(alarme_email, local, EM, config);
                }
            }
            return TagSQL;
        }

        public static void EnleveAlarme(List<Lectures> alarme, List<Lectures> TagSQL, string heure, string devicename)
        {
            string query = null;
            foreach (Lectures Tag in TagSQL)
            {
                //Si l'alarme dans SQL est true && tag n'est plus dans alarme, enleve l'alarme
                if (Tag.GetAlarme() == true && alarme.Any(alrm => alrm.id_rfid == Tag.Getid_rfid()) == false)
                {
                    if (query != null)
                    {
                        query += "; ";
                    }
                    Tag.alarme = false;
                    query += String.Format("UPDATE dbo.rfid SET alarme = 'false' WHERE id_rfid = '{0}'", Tag.Getid_rfid());
                }
            }
            if (query != null)
            {
                ExecuteNonQuery(query);
            }
            foreach (Lectures Tag in TagSQL)
            {
                bool alarmeActive = false;
                if (Tag.alarme == true)
                {
                    alarmeActive = true;
                    break;
                }

                if (alarmeActive == true)
                {
                    ReaderRFID.ReInit(devicename);
                }
            }
        }

        public static List<Appareils> SQLtoAppareils(string table)
        {
            //La requête SQL
            string query = String.Format("SELECT * FROM {0}", table);

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                //Création de la commande envoyé à SQL
                SqlCommand command = new SqlCommand(query, connection);

                //Exécution de la commande et réception de celle-ci dans `reader`
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();

                //Inscrit les lectures dans une liste `list` de classe `Lectures` 
                List<Appareils> list = new List<Appareils>();
                while (reader.Read())
                {
                    //Convertit la lecture de la base de données pour la remettre en classe
                    Appareils resultat = new Appareils();
                    resultat.Initialise(Convert.ToInt32(reader[0]), Convert.ToString(reader[1]));
                    list.Add(resultat);
                }
                reader.Close();

                if (list.Count() == 0)
                {
                    return null;
                }
                else
                {
                    return list;
                }
            }
        }
    }
}